iT邦幫忙

2021 iThome 鐵人賽

DAY 12
2

  前幾天介紹的都是屬於Creational Patter,今天要來介紹最後一個位,也就是Prototype!


問題情境與解析

  假設今天有個複雜的物件,你想要創建它的分身,就必須先創一個同一類別的新物件,然後再遍歷(go through)此類的所有屬性以後才能複製到新的物件。不過可能會碰到一個問題,就是並不是所有的屬性都會是公開的,有可能是私有的,所以不能端看物件的外表而了解其內在。

  當遇到這種情況以後,即使物件本身沒有私有的屬性,但只要需要創建分身,就得寫一大串的程式碼將要創建的物件初始化,而這些程式碼又是重複的,會造成程式碼顯得又臭又長。

  倘若使用Prototype,所有支援克隆(clone)的物件都會有個共同的介面,而克隆的方法都會在所有的類別實現,此方法會創建一個當前類別的物件,並將舊物件所有的屬性複製到新的物件上,即使是私有的屬性也會移並複製過去。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210927/20140743bQU1SUlDHX.png

Skeleton Code

abstract class Prototype {
    Type field;
    
    Prototype(Prototype prototype) {
        this.field = prototype.field;
    }
    
    public abstract Prototype clone();
}

class ConcretePrototype extends Prototype {
    Type field1;
    
    ConcretePrototype(ConcretePrototype prototype) {
		// fields defined in the parent class.
        super(prototype);
        this.field1 = prototype.field1;
    }
    
    public Prototype clone() {
        return new ConcretePrototype(this);
    }
}

  Prototype運行的方式其實很簡單,就是當你創建一個物件,並且初始化完,爾後需要再一個相同的物件時,只需要克隆一原型就可以了,不用再寫重複的程式碼將物件初始化,而且客戶端只須要有所有支援克隆方法物件的共同介面,並不需要去耦合到具體類別就能夠克隆物件,非常方便!


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 11-Builder 建立者模式
下一篇
IT鐵人DAY 13-Composite 組合模式
系列文
淺談物件導向與Design Pattern介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言